var Config = require('@/utils/config.js');
let BASEURL = Config.baseUrl
/**
 * @typedef {Object} RequestOptions
 * @property {string} url - 请求路径
 * @property {string} method - 请求方法(GET, POST, PUT, DELETE等)
 * @property {Object} [data] - 请求数据
 * @property {boolean} [showLoading=true] - 是否显示加载提示
 * @property {number} [timeout=20000] - 超时时间(毫秒)
 * @property {boolean} [handleError=true] - 是否自动处理错误
 */

/**
 * @description 统一请求函数
 * @param {RequestOptions} options - 请求配置项
 * @returns {Promise} - 返回Promise对象
 */
export const request = async (options = {}) => {
	// 设置默认值
	options = Object.assign({
		showLoading: false,
		timeout: 20000,
		handleError: true
	}, options);
	
	// 显示加载提示
	if (options.showLoading) {
		uni.showLoading({
			title: '加载中...',
			mask: true
		});
	}
	
	try {
		return await new Promise((resolve, reject) => {
			handleRequest(options, resolve, reject);
		});
	} finally {
		// 隐藏加载提示
		if (options.showLoading) {
			uni.hideLoading();
		}
	}
}

/**
 * @description 处理HTTP请求
 * @param {RequestOptions} options - 请求配置项
 * @param {Function} resolve - Promise成功回调
 * @param {Function} reject - Promise失败回调
 */
function handleRequest(options, resolve, reject) {
	const token = uni.getStorageSync('token') || "";
	
	// 请求头处理
	const header = {};
	
	// 添加token
	if (token) {
		header['Authorization'] = 'Bearer ' + token;
	}
	
	// 扩展请求头
	if (options.header) {
		Object.assign(header, options.header);
	}
	
	// 发起请求
	const requestTask = uni.request({
		url: BASEURL + options.url,
		method: options.method || 'GET',
		header: header,
		timeout: options.timeout || 20000,
		data: options.data,
		sslVerify: false,
		success: (response) => {
			// 响应处理
			handleResponse(response, options, resolve, reject);
		},
		fail: (err) => {
			// console.error('请求失败:', err);
			if (options.handleError) {
				uni.$uv.toast('网络请求失败');
			}
			if (options.showLoading) {
				uni.hideLoading();
			}
			reject(err);
		}
	});
	
	// 返回请求任务，便于取消请求
	return requestTask;
}

/**
 * @description 处理HTTP响应
 * @param {Object} response - 响应对象
 * @param {RequestOptions} options - 请求配置项
 * @param {Function} resolve - Promise成功回调
 * @param {Function} reject - Promise失败回调
 */
function handleResponse(response, options, resolve, reject) {
	const { code, data, msg } = response.data;
	
	// 成功响应
	if (code === 200) {
		resolve(response);
		return;
	}
	// token失效处理
	if (code === 401) {
		handleTokenExpired();
		reject(response.data);
		return;
	}
	// 其他错误
	if (options.handleError && msg) {
		console.log(msg)
		uni.showToast({
			icon:'none',
			title:msg
		})
	}
	reject(response.data);
}

/**
 * @description 处理token过期
 */
function handleTokenExpired() {
	if(uni.getStorageSync('token')){
		uni.$uv.toast('登录已过期，请重新登录');
	}
	// 延迟跳转到登录页
	setTimeout(() => {
		uni.reLaunch({
			url: "/pages/index/index"
		})
	}, 800);
}

/**
 * @description 封装常用的请求方法
 */
export const http = {
	/**
	 * @description GET请求
	 * @param {string} url - 请求地址
	 * @param {Object} [data] - 请求参数
	 * @param {Object} [options] - 其他配置选项
	 */
	get: (url, data = {}, options = {}) => {
		return request({
			url,
			method: 'GET',
			data,
			...options
		});
	},
	
	/**
	 * @description POST请求
	 * @param {string} url - 请求地址
	 * @param {Object} [data] - 请求参数
	 * @param {Object} [options] - 其他配置选项
	 */
	post: (url, data = {}, options = {}) => {
		return request({
			url,
			method: 'POST',
			data,
			...options
		});
	},
	
	/**
	 * @description PUT请求
	 * @param {string} url - 请求地址
	 * @param {Object} [data] - 请求参数
	 * @param {Object} [options] - 其他配置选项
	 */
	put: (url, data = {}, options = {}) => {
		return request({
			url,
			method: 'PUT',
			data,
			...options
		});
	},
	
	/**
	 * @description DELETE请求
	 * @param {string} url - 请求地址
	 * @param {Object} [data] - 请求参数
	 * @param {Object} [options] - 其他配置选项
	 */
	delete: (url, data = {}, options = {}) => {
		return request({
			url,
			method: 'DELETE',
			data,
			...options
		});
	}
};